'''

对于一个 正整数，如果它和除了它自身以外的所有 正因子 之和相等，我们称它为 「完美数」。
给定一个 整数 n， 如果是完美数，返回 True；否则返回 False。

示例 1：
输入：n = 28
输出：true
解释：28 = 1 + 2 + 4 + 7 + 14
1, 2, 4, 7, 和 14 是 28 的所有正因子。

示例 2：
输入：n = 7
输出：false

提示：  1 <= n <= 108

个人补充：完美数是： 6 28 496......

'''


class solution:
    def checkPerfectNumber(self, n: int) -> bool:
        # 完美数必须是正整数，小于等于1的数直接返回False  1不是完美数
        if n <= 1:
            return False
        # 初始化因子之和，1是所有大于1的数的因子
        factor_sum = 1
        # 寻找因子，只需要检查到sqrt(n)即可 数学方法决定的
        # 因为如果i是n的因子，那么n/i也是n的因子 例如：28/4=7  4和7 都是28的因子
        sqrt_n = int(n ** 0.5)   # 取开方的结果的意思
        for i in range(2, sqrt_n + 1):   ##从2开始遍历 到sqrt_n + 1即可 不从1开始 是因为factor_sum初始化就是1了，已经加上这个1了;另外 这也是探测一个数的因子的常用方法
            # 如果i是n的因子  如果非整除 直接跳过了
            if n % i == 0:  ##整除了 这里限制只有整除 所以 other_factor = n // i 也就不用担心了
                # 加上i这个因子
                factor_sum += i
                # 同时 计算对应的另一个因子n/i
                ##在 Python 中，// 是地板除法（floor division） 运算符，用于对两个数进行除法运算后，返回不大于结果的最大整数（即向下取整）。
                other_factor = n // i
                # 避免i和other_factor相等时重复计算（如4的因子2,25的因子5这种 重复累加）
                if other_factor != i:
                    factor_sum += other_factor
        # 注意：这里不需要考虑n本身，因为完美数的定义是除自身外的因子之和
        # 判断因子之和是否等于原数  等于才返回True 否则返回False
        return factor_sum == n

'''
在 Python 中，if __name__ == "__main__": 是一个常用的代码结构，用于判断当前模块是否被直接运行，而非被导入到其他模块中。
具体作用：
区分模块的两种使用场景
1:当模块被直接运行时（例如通过 python 文件名.py 命令），__name__ 变量的值会被自动设置为 "__main__"，此时 if 条件成立，缩进内的代码会被执行。
2:当模块被导入到其他模块中时（例如 import 文件名），__name__ 变量的值会被设置为模块名（即文件名），此时 if 条件不成立，缩进内的代码不会执行。
典型用途
用于编写模块的测试代码（在直接运行时执行测试，被导入时不执行）。
用于定义模块的主程序入口（类似其他语言的 main 函数）。

'''

if __name__ == "__main__":
    test_cases = [6, 28, 496, 8128, 12, -6, 0, 1]
    ##checkPerfectNumber方法是在solution类里，所以，这里调用时，得先创建一个类的实例
    solu = solution()
    for num in test_cases:
        result = solu.checkPerfectNumber(num)
        print(f"{num} 是完美数: {result}")



'''
输出结果:

6 是完美数: True
28 是完美数: True
496 是完美数: True
8128 是完美数: True
12 是完美数: False
-6 是完美数: False
0 是完美数: False
1 是完美数: False
'''